package modelo;

import java.util.Iterator;

import hbt.AbstractHibernateManager;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import entities.SucursalEntity;


public class SucursalDao extends AbstractHibernateManager{

		private static SucursalDao instancia = null;
		
		public static SucursalDao getInstancia()
		{
			if(instancia == null)
			{
				instancia = new SucursalDao();
			}
			return instancia;
		}
		
		
		public boolean save(SucursalEntity suc){
			Session s= null;
			try {
				s=getNewSession();
				s.beginTransaction();
				s.save(suc);
				s.flush();
				s.getTransaction().commit();
				System.out.println("[Sucursal PERSISTED ON TABLE sucursales]::OK");
				return true;
			} catch (HibernateException e) {
				e.printStackTrace();
				return false;
			} finally {
				closeSession(s);
			}
		}
		
		
		public boolean saveOrUpdate(SucursalEntity suc){
			Session s= null;
			try {
				s=getNewSession();
				s.beginTransaction();
				s.saveOrUpdate(suc);
//				s.flush();
				s.getTransaction().commit();
				System.out.println("[Sucursal (SAVED OR UPDATED) ON TABLE sucursales]::OK");
				return true;
			} catch (HibernateException e) {
				e.printStackTrace();
				return false;
			} finally {
				closeSession(s);
			}
		}

		
		
		public boolean guardar(SucursalEntity suc){
			Session s= null;
			try {
				s=getNewSession();
				s.beginTransaction();
//				s.flush();
				s.persist(suc);
				s.getTransaction().commit();
				System.out.println("[sucursal SAVED ON TABLE sucursales]::OK");
				return true;
			} catch (HibernateException e) {
				e.printStackTrace();
				return false;
			} finally {
				closeSession(s);
			}
		}

		public boolean merge(SucursalEntity suc){
			Session s= null;
			try {
				s=getNewSession();
				s.beginTransaction();
				s.flush();
				s.merge(suc);
				s.getTransaction().commit();
				System.out.println("[sucursal MERGED ON TABLE sucursales]::OK");
				return true;
			} catch (HibernateException e) {
				e.printStackTrace();
				return false;
			} finally {
				closeSession(s);
			}
		}
		
		public SucursalEntity obtenerSucursal(Integer idSucursal) {
			Session s = null;
			System.out.println("\nId Sucursal modelo: "+idSucursal);
			SucursalEntity sucursal = new SucursalEntity();
			
			try {
				s = getNewSession();
				sucursal =  (SucursalEntity) s.createQuery("FROM SucursalEntity sucursal " +
										"WHERE sucursal.id = :idSucursal")
								  .setInteger("idSucursal", idSucursal)
								  .uniqueResult();
			} catch (HibernateException e) {
				e.printStackTrace();
			} finally{
				closeSession(s);
			}
			return sucursal;
		}

		@SuppressWarnings({ "rawtypes" })
		public List<SucursalEntity> todasLasSucursales(){
			Session s = null;
			System.out.println("Obtener todas las sucursales");
			List<SucursalEntity> lista = new ArrayList<SucursalEntity>();
			//s=getNewSession();
			try{
				s=getNewSession();
				System.out.println("Estoy Aqui");	
				Iterator iLista = s.createQuery("FROM SucursalEntity").iterate();
				while(iLista.hasNext()) {
					SucursalEntity enti = (SucursalEntity) iLista.next();
					lista.add(enti);
				}
			}
			catch (HibernateException e){
				e.printStackTrace();
				System.out.println(e);
				System.out.println("Voy por error");
			}
			finally{
				closeSession(s);
			}
			return lista;
		}

}


